ٌٌٌٌٌٌWelcome

تاریخ : پنج شنبه 26 مرداد 1391
نویسنده : hamidrezakhouri

عملگرها نمادهایی هستند که برای انجام اعمال خاصی مورداستفاده قرارمیگیرند. عملگرها در زبان C از تنوع زیادی برخوردارند . در C چهار دسته عملگر به نامهای ( محاسباتی ، رابطه ای ، منطقی و دستکاری بیت ها ) وجود دارند که آنها را بررسی می کنیم .


عملگرهای محاسباتی:
عملگرهای محاسباتی که در C مورد استفاده قرار می گیرند در جدول (۱) فهرستشده اند .


ردیف |      عملگر     |      نام     |       مثال     |

 


 

۱   |   -   |      تفریق و منهای یکانی |   x-y

 


 

2   |   +  |      جمع |      x+y

 


 

3   |  *  |       ضرب |      x*y

 


 

4   |   /  |       تقسیم |  x/y

 


 

5   |   %  |       باقیمانده تقسیم |    x%y

 


 

6  |   - -  |       کاهش یک واحد * | - -x یا x

 


 

۷   |  ++   |       افزایش یک واحد * | x+ + یا | + +xا

 


 

* decrement ** increment

 جدول (۱) . عملگرهای محاسباتی

عملگرهای ردیف ۱تا ۴ در جدول (۱) تقریبا” در همه زبانهای برنامه سازی وجود دارند. عملگر % که در بقیه زبانها با علامت دیگری ( مثلا” در بیسیک به صورت MOD) وجود دارد باقیمانده تقسیم دو عدد را محاسبه می کند :


 
 

اگر سه دستور فوق را توسط ماشین اجرا کنیم مقدار۳ که باقیمانده تقسیم ۱۳ بر ۵ است در z قرار می گیرد .

عملگر کاهش ، یک واحد از عملوند مربوط کم می کند .
 

x= 10 ;
- - x ;

دستور x - - از x یک واحد کم می کند و نتیجه را در x قرار می دهد که معادل دستور x = x-1  است .

عملگر افزایش ، یک واحد به عملوند مربوطه اضافه می کند :


x= 40 ;
x ++ ;

دستور ++x معادل دستور x = x + 1 است که موجب افزودن یک واحد به x می شود .
عملگرهای افزایش و کاهش یک واحد را می توان بعداز عملوند مربوطه نیز به کار برد مثل : x + + و - - x .
اگر در یک عبارت از عملگرهای افزایش و کاهش یک واحد ، استفاده کنیم به کار بردن این عملگرها در قبل و بعد از عملوند مربوطه ، با یکدیگر متفاوت است . بدین معنی که اگر این عملگرها قبل از عملوند باشند مقدار فعلی عملوند مورد استفاده قرار گرفته و سپس عملگرها بر روی آن عمل میکنند، ولی اگر بعد از عملوند مربوطه باشند پس از انجام عمل افزایش و کاهش یک واحد به آنها مقادیر جدید ، در عبارت مورد استفاده قرار می گیرند. استفاده ازعملگرهای افزایش و کاهش یک واحد ، سرعت محاسباتی را بالا می برد .
اگر در یک عبارت از چند عملگر محاسباتی استفاده شود ، مساله تقدم عملگرها مطرح می شود . ( جدول (۲) ) .


بالاترین تقدم - - | + + |
تفریق یکانی - | | * / % |
پایین ترین تقدم - | +

 

 

جدول (۲) . تقدم عملگرهای محاسباتی

 همان طور که در جدول (۲) مشاهده می شود ، عملگرهای افزایش و کاهش یک واحد دارای بالاترین تقدم و عملگرهای جمع و تفریق دارای کمترین تقدم هستند و منهای یکانی ، دارای دومین تقدم است . عملگرهایی که در یک سطر آمده اند ، مثل - و +
بدین معنی است که دارای تقدم مکانی نسبت به یکدیگر هستند. در این صورت هر کدام از غملگرها که اول ظاهر شود ، زودتر انجام خواهد شد .

عملگرهای رابطه ای :
عملگرهای رابطه ای برای تشخیص ارتباط بین عملوندها یا مقایسه آنها مورد استفاده قرار می گیرند ( جدول (۳) ) .

 نکته قابل ذک درمورد عملگرهای رابطه ای این است که عملگر== برای تشخیص مساوی بودن دو عبارت مورد استفاده قرار می گیرد. این عملگر با عملگر= که برای انتساب یک عبارت به یک متغیر استفاده می شود متفاوت است .

عملگرهای منطقی
عملگرهای منطقی ( جدول (۴) ) بر روی عملوندهای منطقی عمل میکنند. عملوندهای منطقی دارای دو ارزش درستی و نادرستی هستند .

 ارزش نادرستی درزبان C با مقدار صفر و ارزش درستی با مقادیر غیراز صفر مشخص میشود. عملگر منطقی ! دارای بالاترین تقدم و عملگر || دارای کمترین تقدم در بین عملگرهای منطقی هستند . چون عملگرهای منطقی رابطه نزدیکی با عملگرهای رابطه ای
دارند می توان تقدم آنها را نسبت به یکدیگر بیان کرد ( جدول (۵) ) .


بالاترین تقدم: |  ! |
> >= < <= |
| == != |
| && |
|
پایین ترین تقدم :  ||

 

 

جدول (۵) . تقدم عملگرهای منطقی و رابطه ای

 عملگرهای محاسباتی و رابطه ای با یکدیگر ترکیب شده و عملگرهای دیگری را بنام عملگرهای محاسباتی رابطه ای ایجاد می کنند ( جدول (۶) ) . تقدم این عملگرها از سایر عملگرها پایین تر است .


عملگر | نام | مثال |

 

 

+= | + انتساب جمع | x+=y |

 

 

= | انتساب تفریق | x-=y |

 

 

*= | * انتساب ضرب | x*=y |

 

 

/= | / انتساب تقسیم | x/=y |

 

 

%= | % انتساب باقیمانده تقسیم | x%=y |

 

 

جدول (۶) . عملگرهای محاسباتی و رابطه ای

 

در جدول (۶) ، عبارت x + = y معادل با x = x + y است .

 int a=10 ;
int b=20 ;
a+= b ;
 

با اجرای دستورات فوق متغیر a برابر۳۰ خواهد بود. زیرا دستور a + = b معادل دستور a = a + b است .

عملگر دستکاری بیت ها:
ازآنجایی که زبان C طوری طراحی شده است که بتواند دربسیاری ازموارد جایگزین زبان اسمبلی گردد. باید قادر باشد کلیه اعمال ( یا حداقل بسیاری از اعمال ) که در زبان اسمبلی قابل انجام هستند را انجام دهد . یکی از اعمالی که در زبان اسمبلی براحتی انجام پذیر است . انجام اعمالی بر روی بیت های یک بایت یا یک کلمه از حافظه است که در زبان C برای انجام این منظور از عملگرهایی استفاده می شود که به عملگرهای بیتی معروفند ( جدول (۷) ) . این عملگرها انجام اعمال تست ، مقدار دادن و یا انتقال (shift) بیت ها را در یک بایت یا کلمه حافظه امکان پذیر می نمایند. عملگرهای بیتی فقط بر روی متغیرهایی از نوع charیا intا
عمل می کنند و بر روی متغیرهایی از نوع float، double،، long double،، void، و یا سایر متغیرها قابل اجرا نیستند .

 عملگرهای بیتی &، |،و ~و(AND(، OR،و NOTو) مشابه عملگرهای منطقی AND، OR،و NOTو عمل می کنند با این تفاوت که عمل آنها بر روی یک بیت است . با فرض این که pو qو دو بیت مختلف باشند ، نحوه عمل عملگر ^ را در ذیل مشاهده می نمایید .

p  |  q | p^q |

0   |  0   |   0 |

1   |  0   |   1 |

1   |  1   |   0 |

عملگرهای بیتی در جدول (۷) مشاهده می شوند .

عملگر  | نوع عمل |
&  | AND ( و ) |
|  | OR ( یا ) |
^ | XOR ( یا انحصاری ) |
~ | NOT ( نقیض یا متمم یک ) |
>> | انتقال به سمت راست (shift right) |
<< | انتقال به سمت چپ (shift left) |

جدول (۷) . عملگرهای بیتی

همان طور که مشاهده شد ، نتیجه عملگر بیتی ^ وقتی یک (۱) است که یکی از عملوندهای آن صفر و دیگری یک باشد . به عبارت دیگر ، نتیجه عملگر بیتی ^ وقتی صفر است که هر دو عملوند آن صفر و یا هر دو یک باشند .
عملگرهای &، |،و ^و و << ، >> بر روی دو عملوند عمل می کنند.  هر انتقال به چپ ، معادل با تقسیم کردن مقدار متغیر به ۲ و هر انتقال به راست ، معادل ضرب کردن در ۲ است .

مثال ۱ :
تعداد عددی متغیر | x مقدار بیتی متغیر | x دستورات زبان | C

char x ;

| x=7 ; | 00000111 | 7 |

| x<<1 ; | 00001110 | 14 |

| x<<3 ; | 01110000 | 112 |

| x<<2 ; | 11000000 | 192 |

| x>>1 ; | 01100000 | 96 |

| x>>2 ; | 00011000 | 24 |

همان طور که مشاهده می کنید پس از اجرای دستور ۲<< x< اطلاعات واقعی از بین می روند و مساله ضرب در ۲ شدن ، در اینجا صدق نمی کند .
عملگر ~ در یک بایت یا کلمه حافظه ( یک متغیر ) کلیه بیت ها را نقیض میکند. یعنی بیت صفر را به بیت یک و بیت یک را به بیت صفر تبدیل می نماید . لذا اگر این عملگر دو بار بر روی یک متغیر عمل کند وضعیت بیت های متغیر به حالت اول برمی گردند .

مثال ۲ : x :00101100

~x :11010011
~x :00101100

همان طور که مشاهده می شود بیت های ردیف اول و ردیف آخر دارای یک وضعیت میباشند ( بیت های ردیف آخر نتیجه دوبار اجرای عملگر نقیض بر روی متغیر است ).
نکته ای که در مورد عملگرهای بیتی باید در نظر داشت این است که این عملگرها معمولا” در مبدل های دستگاهها (device drivers) مورد استفاده قرار می گیرند .
مثل برنامه هایی که برای کار با modem و با چاپگر نوشته می شوند . زیرا در این گونه موارد معمولا” تست کردن بیت های یک متغیر مد نظر خواهد بود .

عملگر ?
عملگر ? با تست یک شرط ، مقداری را به یک متغیر نسبت می دهد .
نحوه عمل ? به این صورت است که : ابتدا عبارت اول (exp1) ارزیابی می شود چنانچه این عبارت دارای ارزش true ( ارزش درستی ) باشد مقدار exp2 پس از ارزیابی ، در متغیر ذکر شده قرار می گیرد وگرنه عبارت سوم (exp3) ارزیابی شده و نتیجه آن به متغیر ذکر شده منتقل می شود .

x= 10;
y= x>9 ? 100 : 200 ;

نحوه عمل در دو دستور فوق به این صورت است که عبارت ۹> x> ارزیابی می شود . چون این عبارت یک ارزش منطقی true دارد
( ۹> x> است ) لذا عدد ۱۰۰ در متغیر y  قرار می گیرد .

عملگرهای &و *
عملگر & یک عملگر یکانی است که آدرس عملوند خود را مشخص می کند و به صورت زیر به کار می رود :

نام عملوند &
مثال :

 int num ;
p= &num ;
 

با اجرای دستورات فوق آدرس متغیر num در متغیر p قرار می گیرد. لذا عملگر & به معنی ” آدرس ” است . عملگر * همانند عملگر & یک عملگر یکانی است که محتویات یک آدرس حافظه را مشخص می کند و به صورت زیر به کار می رود .

نام عملوند *
مثل :

p= &num ;
m= *p ;
 

دستور اول ، آدرس متغیر num را در p قرار میدهد و دستور دوم ، محتویات محلی را که آدرس آن در p قرار دارد ( محتویات num ) ، را در m قرار میدهد. بنابراین مفهوم ” * محتویات آدرس ” می باشد . دو دستور فوق معادل دستور m = num; است که موجب انتقال محتویات متغیر num به متغیر m می شود .

عملگر کاما (,)
عملگر کاما برای انجام چند عمل در یک دستور ، به کار رفته و به صورت زیر استفاده می شود :
( عبارت ۲ و عبارت ۱) =) متغیر
عملگر کاما موجب می شود تا ” عبارت ” ۱ ارزیابی شده و سپس نتیجه ارزیابی ”عبارت ” ۲ با یکدیگر ارتباط دارند .

x =( y = 3 , y + 5) ;

ابتدا y باربر با ۳ قرار می گیرد و نتیجه عبارت y + 5 که برابر ۸ است در x قرار خواهد گرفت .

عملگر sizeof
این عملگر که عملگر زمان ترجمه نامیده می شود، برای محاسبه طول یک نوع و یا یک متغیر به کار رفته و به صورت زیر استفاده می شود .
; (نوع) sizeof
; متغیر sizeof
اگر بخواهیم با استفاده از این عملگرها، طول یک نوع مثل int، double و غیره را محاسبه کنیم باید آن را در داخل پرانتز قرار دهیم : اما اگر بخواهیم طول یک متغیر را محاسبه کنیم نیازی به استفاده از پرانتز نیست . به عنوان مثال :

  int a, b, c ;
a= sizeof( int) ;
b= sizeof c ;
 

تقدم عملگرها در حالت کلی
وقتی که در یک عبارت چندین عملگر مورد استفاده قرار می گیرند تقدم عملگر به صورت جدول (۸) خواهد بود .


بالاترین تقدم:   () | | ! ~ + + - - * & sizeof |
| * / % |
| + - |
| << >> |
| << = >> = |
| == =! |
| & |
| ^ |
| | |
| && |
| || |
| ? |
| = +=- = *= /= %= |
| , |

 


جدول (۸) . تقدم عملگرها در حالت کلی

اگر در یک عبارت چندین عملگر وجود داشته باشد و درآن از پرانتز نیز استفاده شود ، تقدم پرانتز از سایر عملگرها بیشتر بوده و عبارت داخل پرانتز زودتر ارزیابی می شوند .

مثال ۳ :

int x=5/ y=10/ k=4 ;
int s ;
s= x*((x+y-)3)/k ;

 

درنتیجه اجرای چند دستور فوق مقداری که درs قرار می گیرد برابر با ۱۵ خواهد بود . سپس عدد ۳ از ۱۵ کم می شود که ۱۲ حاصل می گردد و بعداز آن عمل ضرب انجام برابر با ۶۰ ( ۵ * ۱۲ ) می باشد و عملگر تقسیم (/) آخرین است.


نظرات شما عزیزان:

نام :
آدرس ایمیل:
وب سایت/بلاگ :
متن پیام:
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

 

 

 

عکس شما

آپلود عکس دلخواه:






موضوعات مرتبط: مقالات C++ / C

آخرین مطالب

آمار وبلاگ:

بازدید امروز : 28739
بازدید دیروز : 39156
بازدید هفته : 28739
بازدید ماه : 3981287
بازدید کل : 1580053981
تعداد مطالب : 405
تعداد نظرات : 6
تعداد آنلاین : 287